<?php
class Admin_CampanhaController extends Zend_Controller_Action
{
    protected $_campanha;
    protected $_tbRi;
    protected $_link;
    protected $_join_filtro;
    protected $_email;
    protected $_filaEntrega;
    
    public function init ()
    {
        // Models
        $this->_campanha = new Application_Model_Campanha();
        $this->_link = new Application_Model_Link();
        $this->_campanhaEnviar = new Application_Model_Campanhaenviar();
        $this->_join_filtro = new Application_Model_JoinFiltro();
        $this->_email = new Application_Model_Email();
        $this->_filaEntrega = new Application_Model_FilaEntrega();
        $this->_tbRi = new Application_Model_TbRi();
        $this->translator = Zend_Registry::get('translator');
    }
    public function preDispatch ()
    {
        if (! Zend_Auth::getInstance()->getIdentity()) {
            $this->_redirect('/autenticacao');
        }
    }
    public function criarAction()
    {
    	$form = new Application_Form_Campanha();
		$this->view->form = $form;
		$auth = Zend_Auth::getInstance();
		$idusuario = $auth->getIdentity()->idusuario;
		 if ($this->_request->isPost()) {
            $dadosForm = $this->_request->getPost();
            if ($form->isValid($dadosForm)) {
                try {
                	$nome = $dadosForm['nome'];
                	$assunto = $dadosForm['assunto'];
                	$remetente = $dadosForm['remetente'];
                	$mensagem = $dadosForm['html'];
                	$datacriacao = date('Y-m-d'); 
                	//date('d/m/Y H:m:s', strtotime($data));
                	$ano = substr($dadosForm['dataenvio'], 6,4);
                	$mes = substr($dadosForm['dataenvio'], 3,2);
                	$dia = substr($dadosForm['dataenvio'], 0,2);
                	$data = $ano.'-'.$mes.'-'.$dia;
                	$dataenvio = $data.' '.$dadosForm['horaenvio'].':'.$dadosForm['minutoenvio'].':00';
                	$idlista = $dadosForm['lista'];
                	$idfiltro = $dadosForm['filtro'];
                	$this->_campanha->addCampanha($nome, $assunto, $remetente, $mensagem, $datacriacao, $dataenvio, $idusuario, $idlista, $idfiltro);
                	$this->_helper->flashMessenger(array('flashmessage' => 'Campanha criada com sucesso!'));
                	$this->_redirect('/admin/campanha/minhas-campanhas');                  
                } catch (Zend_Db_Exception $e) {
                    $this->_helper->flashMessenger(array('flashmessage' => $e));
                }
            }
            
		 }	
    }
    
    public function minhasCampanhasAction()
    {
        $pagina = (int) ($this->_getParam('pagina', 1));
        $data = $this->_campanha->listaAllCampanhasAtivas();     
        $paginacao = Zend_Paginator::factory($data);
        $paginacao->setItemCountPerPage(10);
        $paginacao->setCurrentPageNumber($pagina);
        $this->view->listaCampanhasAtivasPaginacao = $paginacao;
    }
    
    public function excluirCampanhasAction()
    {
       if ($this->_hasParam('id') == false) {
            $this->_redirect('/admin/campanha/minhas-campanhas');
        } else {
            $idCampanha = $this->_request->getParam('id');
            $this->_campanha->excluirCampanha($idCampanha);
            $this->_redirect('/admin/campanha/minhas-campanhas');
            $this->_helper->flashMessenger(array('flashmessage' => 'Campanha excluída com sucesso!'));
        }
    }
    /**
     * Editar campanha no status em envio
     */
    public function editarEnvioCampanhaAction()
    {
    	if ($this->_hasParam('id') == false) {
            $this->_redirect('/admin/campanha/campanhas-em-envio');
        } else {
        	$id = $this->_request->getParam('id');
        	try {
	    		$this->_campanhaEnviar->delete($id);
	    		$this->_campanha->updateStatus(0, $id);
	    		$this->_link->removeLink($id);
	    		$this->_redirect('/admin/campanha/editar-campanhas/id/'.$id);
        	}catch (Zend_Db_Exception $e){
        		$this->_helper->flashMessenger(array('flashmessage' => $e));
        	}
        }
    }
    
    /**
     * Metodo para editar campanhas criadas
     */
    public function editarCampanhasAction()
    {
    try {	
    	$campanha= $this->_campanha->procuraCampanha($this->_request->getParam('id'));
   
	    $dataenvio = new Zend_Date($campanha[0]['dataenvio']);
	    
	    $form = new Application_Form_Campanha();	    
	      
	    $form->getElement('html')->setValue($campanha[0]['mensagem']);
	    $form->getElement('nome')->setValue($campanha[0]['nome']);
	    $form->getElement('assunto')->setValue($campanha[0]['assunto']);
	    $form->getElement('remetente')->setValue($campanha[0]['remetente']);
	    $form->getElement('dataenvio')->setValue(substr($dataenvio,0,10));
	    $form->getElement('horaenvio')->setValue($dataenvio->toValue(Zend_Date::HOUR));
	    $form->getElement('minutoenvio')->setValue($dataenvio->toValue(Zend_Date::MINUTE));
	    $form->getElement('lista')->setValue($campanha[0]['idlista']);
	    $form->getElement('filtro')->setValue($campanha[0]['idfiltro']);
	 
	    $id = new Zend_Form_Element_Hidden('id');
	    $id->setValue($this->_request->getParam('id'));
	    $form->addElements(array($id));
	
	    $this->view->form = $form;
	    $this->view->idlista = $campanha[0]['idlista'];
	    $this->view->idfiltro = $campanha[0]['idfiltro'];
	    
     }catch (Zend_Db_Exception $e) {
             $this->_helper->flashMessenger(array('flashmessage' => $e));
    }
	
    //Se for via post
	    if($this->_request->isPost()){
	    	$data = $this->_request->getPost();
	    	 if ($form->isValid($data)) {	
		  		$ano = substr($data['dataenvio'], 6,4);
	            $mes = substr($data['dataenvio'], 3,2);
	            $dia = substr($data['dataenvio'], 0,2);
	            $dataFormatada = $ano.'-'.$mes.'-'.$dia;
	            $minuto = $data['minutoenvio'];
	            if($minuto==0){$minuto = '00';}
	            $dataenvioAtualizada = $dataFormatada.' '.$data['horaenvio'].':'.$minuto.':00';
					
		    	try {
		    		$this->_campanha->update($data['id'], $data['nome'],$data['assunto'],$data['remetente'],$data['html'],$dataenvioAtualizada,(int)$data['lista'],(int)$data['filtro']); 
		    		$this->_redirect('/admin/campanha/minhas-campanhas');
		    	}catch (Zend_Db_Exception $e) {
	             	$this->_helper->flashMessenger(array('flashmessage' => $e));
	   			}
	    	 }
	    }
    	
    }
    /**
     * Metodo para enviar campanhas ativas
     */
    public function enviarCampanhaAction()
    {
    	try {
	    	$dadosCampanha = $this->_campanha->procuraCampanha($this->_request->getParam('id'));
	    	//$this->view->html = $dadosCampanha[0]['mensagem'];
	    	$this->formatarCampanhaEnviaAction($dadosCampanha[0]['mensagem'], $dadosCampanha[0]['idcampanha']);
    	}catch (Zend_Db_Exception $e) {
             $this->_helper->flashMessenger(array('flashmessage' => $e));
   		}
    	
    }
    /**
     * Metodo para formatar campanha para o envio
     * @param string $html
     * @param int $idcampanha
     */
    public function formatarCampanhaEnviaAction($html,$idcampanha)
    {
    	$htmlFormatado = $html;
		while(strlen(strstr($htmlFormatado, "href")) > 0)
		{
		       $htmlFormatado = trim(substr(trim(substr(strstr($htmlFormatado,"href"),4)),1));
		       $delimitator = substr($htmlFormatado, 0, 1);
		       $htmlFormatado = substr($htmlFormatado, 1);
		       $link = (strstr($htmlFormatado, $delimitator, true));	       
		       $this->_link->addLink($link, $idcampanha);
		       $htmlFormatado=strstr($htmlFormatado, $delimitator);
		       
		}
		try {
			$data_links = $this->_link->listaAllLinks($idcampanha);
			$tam = count($data_links);		
			for($i=0;$i<$tam;$i++)
			{
				$jump =0;
				//Padrão url emailmarketing
				switch ($data_links[$i]['link'])
				{
					case '##LINK_OPTOUT##':
					$html = (str_replace($data_links[$i]['link'], '##LINK_OPTOUT##',$html));
					$jump = 1;
					break;
				}	
				if($jump==0){				
					$html=(str_replace($data_links[$i]['link'],'http://sender.localhost/default/mkt/index/c/'.$idcampanha.'/lk/'.$data_links[$i]['idlink'],$html));
				}				
			}
			$this->_campanhaEnviar->addCampanhaEnvio($html, $idcampanha, 1);
			$data_campanha = $this->_campanha->procuraCampanha($idcampanha);
			
			$result = $this->_join_filtro->listaAllFiltros($data_campanha[0]['idfiltro']);
			count($result)!=0 ?	$where.='(v.lista_idlista='.$data_campanha[0]['idlista'].' and v.optin=1 and ': $where.='(v.lista_idlista='.$data_campanha[0]['idlista'];
			//$where.='v.lista_idlista='.$data_campanha[0]['idlista'].' and v.optin=1 and ';
			for($i=0; $i<count($result); $i++)
			{	
					if($result[$i]['expressao']=='like'){$porcento='%';} //porcento no caso like
					if($result[$i]['conector'] != NULL)
					{					
						$where .= 'v.'.$result[$i]['campo']." ".$result[$i]['expressao']." '".$result[$i]['palavraChave'].$porcento."' ".$result[$i]['conector']." ";
					}else
					{
					$where .= 'v.'.$result[$i]['campo']." ".$result[$i]['expressao']." '".$result[$i]['palavraChave'].$porcento."' ";
				}
						
			}
			$data_campanhaenviar = $this->_campanhaEnviar->procuraCampanhaEnviar($idcampanha);
			count($result)!=0? $where.=') and v.optin=1 and v.lista_idlista='.$data_campanha[0]['idlista'] : $where.=' and v.optin=1)';		
			$data_emails = $this->_email->contaEmail($where);
			$tam = count($data_emails);
			for($i=0; $i<$tam;$i++)
			{
				$this->_filaEntrega->addFilaEntrega($data_emails[$i]['idemail'], $data_campanhaenviar[0]['idcampanha_enviar'], $status=0);
			}
			$this->_campanha->updateStatus($status = 1, $idcampanha);
			
		}catch (Zend_Db_Exception $e) {
             $this->_helper->flashMessenger(array('flashmessage' => $e));
   		}
		$this->_redirect('/admin/campanha/minhas-campanhas');
		 	
    }
    public function campanhasEmEnvioAction()
    {
    	$pagina = (int) ($this->_getParam('pagina', 1));
        $data = $this->_campanha->listaAllCampanhaEnviarAtiva();
        $paginacao = Zend_Paginator::factory($data);
        $paginacao->setItemCountPerPage(10);
        $paginacao->setCurrentPageNumber($pagina);
        $this->view->listaCampanhasAtivasPaginacao = $paginacao;
    }
    
    /**
     * Metodo para mostrar campanhas que foram encerradas
     * @since 11/02/2012
     * @author Ricardo Santos Alvarenga
     */
    public function campanhasEncerradasAction()
    {
        $pagina = (int) ($this->_getParam('pagina', 1));
        $data = $this->_campanha->listaAllCampanhasEncerradas();
        $paginacao = Zend_Paginator::factory($data);
        $paginacao->setItemCountPerPage(15);
        $paginacao->setCurrentPageNumber($pagina);
        $this->view->listaCampanhasEncerradasPaginacao = $paginacao;
    }
    
    /**
     * Metodo para duplicar campanha salva
     */
    public function copiarCampanhasAction()
    {
        if ($this->_hasParam('id') == false) 
        {
            $this->_redirect('/admin/campanha/minhas-campanhas');
            
        } else {
	    	$idCampanha = $this->_request->getParam('id');
	    	try {
		    	$data = $this->_campanha->procuraCampanha($idCampanha);	    	
		    	$this->_campanha->addCampanha($this->translator->_('COPIA').$data[0]['nome'], $data[0]['assunto'], $data[0]['remetente'], $data[0]['mensagem'], $data[0]['datacriacao'], $data[0]['dataenvio'], $data[0]['idusuario'], $data[0]['idlista'], $data[0]['idfiltro']);
		    	$this->_redirect('/admin/campanha/minhas-campanhas');
	    	}catch (Zend_Db_Exception $e) {
            	 $this->_helper->flashMessenger(array('flashmessage' => $e));
   			}
        }
    }
    
    /**
     * Busca campanhas processadas em todo o sistema, utilizando calculo de similaridade
     * @since 21/04/2012
     */
    public function buscarCampanhasAction ()
    {
        $form = new Application_Form_BuscaCampanha();
        $formAvancado = new Application_Form_BuscaAvancadaCampanha();
        $form->getElement('Buscar')->setName('Pesquisar');
        $this->view->form = $form;
        $this->view->formAvancado = $formAvancado;
        $resultAtual = array();
        $resultConsulta = array();
        if ($this->_request->isPost()) 
        {
            $dadosForm = $this->_request->getPost();
           	if($dadosForm['tipo']=='buscaIndexada')
           	{
           	   if ($form->isValid($dadosForm))
           	   {           	
	            	$texto = $dadosForm['texto'];
	                $texto = strtoupper($texto);
	                $arrayTermos = array();
	                $arrayTermos = array_unique(explode(" ", trim($texto))); //cria o vetor com os termos
	                $indice = array_search("", $arrayTermos);
	                if($indice!==false){
	                	unset($arrayTermos[$indice]); //remove valor nulo
	                }
	
	                foreach($arrayTermos as $termo) //para todos os termos
					{                    
	                    $resultAnterior = $resultAtual;
	                    $resultAtual = $this->_tbRi->findCampanhas($termo);                  
	                    if (count($arrayTermos) > 1) //se houver mais de um termo, concatena ao vetor
						{
							if($resultAtual){
								$resultAtual = array_merge_recursive($resultAnterior,$resultAtual);
	                        	$result = $resultAtual;
							}
						}else
						{
							$result = $resultAtual;
						}	
					}
	                //agrupa os termos e soma os pesos por campanhas
	                $tam=count($result);
	                $jump = array();
	                for ($i = 0; $i < $tam; $i ++) {
	                    for ($j = 0; $j < $tam; $j ++) {
	                        if (!$this->_tbRi->verificaIndiceArray($j, $jump)) //se nao foi removido
	                        {
	                            if ($i != $j) {
	                                if ($result[$i]['campanha_idcampanha'] == $result[$j]['campanha_idcampanha']) 
	                                {
	                                    $result[$i]['peso'] = $result[$i]['peso'] + $result[$j]['peso'];                                    
	                                    if(is_array($result[$i]['termo']))
	                                    {
	                                    	array_push($result[$i]['termo'], $result[$j]['termo']);
	                                    }else
	                                    {
	                                    	$result[$i]['termo'] = array($result[$i]['termo'],$result[$j]['termo']);
	                                    }
	                                    unset($result[$j]);
	                                    array_push($jump, $j);
	                                }
	                            }
	                        }
	                    }
	                }
	                $resultConsulta = $this->_tbRi->calcularSimilaridade($result);                
	                 foreach ($resultConsulta as $key => $row) //ordena o vetor descrecente pela similaridade 
	                 {
	                    $idtb_ri[$key] = $row['idtb_ri'];
	                    $termo[$key] = $row['termo'];
	                    $frequencia[$key] = $row['frequencia'];
	                    $similaridade[$key] = $row['peso'];
	                    $campanha_idcampanha[$key] = $row['campanha_idcampanha'];
	                }
	                array_multisort($similaridade, SORT_DESC, $campanha_idcampanha,SORT_DESC, $resultConsulta);
	                $resultBusca = array();
	                foreach ($campanha_idcampanha as $row) //ordena a consulta
	                {
	                	$resultRow = $this->_campanha->findCampanhaBusca($row);  
	                	$resultBusca = array_merge_recursive($resultBusca,$resultRow);
	                }                             
					$this->view->BuscarCampanhasPaginacao = $resultBusca;
	                
	            }
           	} else {
                    $assunto = $dadosForm['assunto'];
                    $ano = substr($dadosForm['dataenvioinicial'], 6, 4);
                    $mes = substr($dadosForm['dataenvioinicial'], 3, 2);
                    $dia = substr($dadosForm['dataenvioinicial'], 0, 2);
                    $dtinicial = $ano . '-' . $mes . '-' . $dia;
                    $ano = substr($dadosForm['dataenviofinal'], 6, 4);
                    $mes = substr($dadosForm['dataenviofinal'], 3, 2);
                    $dia = (int)substr($dadosForm['dataenviofinal'], 0, 2);
                    $dtfinal = $ano . '-' . $mes . '-' . $dia+1;
                    $resultBusca = $this->_campanha->findCampanhaBuscaAvancada(
                    $assunto, $dtinicial, $dtfinal);
                    $this->view->BuscarCampanhasPaginacao = $resultBusca;
            }
        }       
    }
}